{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from heapq import heappush, heappop\n",
    "import numpy as np\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def dijkstra(graph, source):\n",
    "    distance = {}\n",
    "    queue = [(0, source)]\n",
    "    \n",
    "    while queue:\n",
    "        # shortest unexplored path\n",
    "        p, v = heappop(queue)\n",
    "        if v in distance:\n",
    "            continue\n",
    "\n",
    "        # shortest path (source, ..., v)\n",
    "        print('({}, ..., {}) = {}'.format(source, v, p))\n",
    "        distance[v] = p\n",
    "\n",
    "        # extend path to (source, ..., v, u)\n",
    "        for _, u, e in graph.edges(v, data=True):\n",
    "            heappush(queue, (p + e['weight'], u))\n",
    "    \n",
    "    return distance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "n = 20\n",
    "graph = nx.Graph()\n",
    "graph.add_nodes_from(range(n))\n",
    "for u, v in np.random.randint(0, n, (n, 2)):\n",
    "    graph.add_edge(u, v, weight=abs(u - v))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAHVCAYAAADywj0dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8nFXZ//HPPemSriwtZacspVAoLUhRFrFIi0HDWpEK\ntoDihrhjcXkMl5dREfj5iCL6IItLCwIiKBg10IJlFVnL1pV9LVCga5q2yfz+OHe6JpOZZCb3LN/3\n65VXM9vp1TZNvnPuc64TpdNpREREREQqXSrpAkREREREioGCsYiIiIgICsYiIiIiIoCCsYiIiIgI\noGAsIiIiIgIoGIuIiIiIAArGIiIiIiKAgrGIiIiICKBgLCIiIiICKBiLiIiIiAAKxiIiIiIigIKx\niIiIiAigYCwiIiIiAigYi4iIiIgACsYiIiIiIoCCsYiIiIgIoGAsIiIiIgIoGIuIiIiIAArGIiIi\nIiKAgrGIiIiICKBgLCIiIiICKBiLiIiIiAAKxiIiIiIigIKxiIiIiAigYCwiIiIiAigYi4iIiIgA\nCsYiIiIiIgD0SroAEcmPmvqGvsABwCigGlgNzAWebKyrbU6yNhERkVIQpdPppGsQkS6qqW9IAROB\nacB4oAmIgCqgBUgD/YDZwCXAzMa62tZkqhURESluCsYiJaqmvmEEcAMwEhhACMQdSQMrgQXA5Ma6\n2kWFr1BERKS0KBiLlKCa+oZJwHSgL2F2OFstQDMwtbGu9uZC1CYiIlKqFIxFSkwcimcQlkh0VRMw\nReFYRERkAwVjkRISL5+YA/TPw3CrgDGNdbXP5mEsERGRkqd2bSIlIt5odwNh+UQ+9AVujMcVERGp\neGrXJlI6JhI22rW7pviEccM5Zuwu7D5sEP9++jV+dusTnY1XFY83Abgjr5WKiIiUIM0UiZSOaYTu\nE+1asqKZ6+5dxO2Pv5LLmAOA87tbmIiISDlQMBYpAfHhHePJ0JLtvnlv8MD8xSxrWpPL0BEwPh5f\nRESkoikYi5SGAwidJAqhCRhdoLFFRERKhoKxSGkYReYDPLojAvYr0NgiIiIlQ8FYpDRUk9tBHrmo\niscXERGpaArGIqVhNeHUukJoiccXERGpaArGIqVhLpDxNJ5UFNG7KkUqFW34PMpq9UUaeCYfRYqI\niJQy9TEWKQ1P0skR0KcfOYKp40euvz1xzC5Mn72AGXcv7GzsfsBT3a5QRESkxOlIaJESUVPfcAfh\nMI58bsJLA7Ma62qPyeOYIiIiJUlLKURKxyXAyjyPuRK4OM9jioiIlCQFY5HSMRNYQP424bXE483K\n03giIiIlTUspREpITX3DCGAO0D8Pw60CxjTW1T6bh7FERERKnmaMRUpIY13tImAq3T8FrwmYqlAs\nIiKygWaMRUpQTX3DJGA60JfcDv5oAZoJofjmQtQmIiJSqhSMRUpUvKziBmAkMIDM3SrShI12C4BT\nNVMsIiKyJQVjkRJWU9+QIrRwOx8YT1giERFmkVsIgbgfMJvQfWJWY11tazLVioiIFDcFY5EyUVPf\n0BcYDewHVBOOeX4GeKqxrrY5ydpERERKgYKxiIiIiAjqSiEiIiIiAigYi4iIiIgACsYiIiIiIoCC\nsYiIiIgIoGAsIiIiIgIoGIuIiIiIAArGIiIiIiKAgrGIiIiICKBgLCIiIiICQK+kCxAREYH1x5of\nAIxiw7Hmc4Enday5iPQEHQktIiKJqalvSAETgWnAeKAJiIAqoAVIA/2A2cAlwMzGutrWZKoVkXKn\nYCwiIomoqW8YAdwAjAQGEAJxR9LASmABMLmxrnZR4SsUyUxXOcqPgrGIiPS4mvqGScB0oC9hdjhb\nLUAzMLWxrvbmQtQmnavkQKirHOVNwVhERHpUHIpnEMJDVzUBUxSOe44Coa5yVAIFYxER6TFxsJgD\n9M/DcKuAMY11tc/mYSzJQIFQVzkqhdq1iYhIj4hnHG8gBIt86AvcGI8rBRIHwjnAWGAgmUMx8eMD\n4+fPiV9f0ja6ytGf3EIx8fP7AzPK4e+i3OmbiYiI9JSJhBnH9cHihHHDuezsI7jtu8dy3glj1j+x\nVyri+6e8jz985cM01tUyZvi27Y1XFY83ocB1VywFwvWz5dPp3tIf4tdPr6lv2Kv7VUmhKBiLiEhP\nmUa4DL/ekhXNXHfvIm5//JUtnvz0S+9w8V8fZ8ny1ZnGHACcn9cqBVAgBF3lqET6hxERkYKLuxiM\nZ7PL8PfNe4MH5i9mWdOaTZ6/rjXNLf99gadffpfWzHthImB8PL7kiQLhellf5QA4cPchXHXOeP72\nnWO5eOqhDNtqi/cUuspR5ErtC1RERErTAYQuBvmXTjcPTi870t0Hu3sfd+9sDax0botA2E2lGgiz\nvsoxuF9vLvjEwfzh3/M55ZLbWfDae3xv0kHtjamrHEVMR0KLiEhPGEXnm7a6JEXrwGHpt+/Y6K60\nu68mBPHVHXx05bFsXtNsZuXQomyLQLi5i6ceyqhdtqalNczov718NZ/99exML2kLhHdkelKxyHSV\nA2DkjlsxtHf1+vuP2HcHXnxrBffMDY9Pv3shfz7vGHYdMoCXl6zceIj1VznKvedzKVIwFhGRnlBN\n/mYft5De9AJoRFjX2t21sV3i7mvomRC+xYeZre1u/R0FwvZc/s+n+dfjL2c7dMkEQnePqqIDD2yh\najVR1Dub1wzfbhDPLV62/nbz2hZee3clw7cbtHkwhvBvOBp4JG9FS14oGIuISE9YTejnWghpSK8g\nBK9qkv/Z1if+GNzTv7G7t9DNED6CbYc+G+3eko5SWQXCnKTTqwez/Eh3n8uGv6feWXye7fNy/bzD\nx/ZIv8Rz0XBas3w/169PL5au2jTvr2peR78+7X45RsB+KBgXnaS/eYiISGWYSzj4YROpKKIqFZFK\nRaSiiN5VKVpa07Sm0/Su2jAL3KsqRe+qFGtbtlyl0BpVLX822uPoX9d9+REAd+9F2OxVTZg1rm7n\no6P7u/pY2/1JbwKsIixZyLgMojMR6S3/sdrx6aP34TMT9uWVJSv4/V3zeeLFdzI+P0XroM2WvRSt\ndI7bsJrWrKN/303fSwzo25umNevae3oV4etFioyCsYiI9IQnaWdpw+lHjmDq+JHrb08cswvTZy9g\nxt0LuepL49lh63BA3oWf+gAAZ/zyThYv3WIPXz/gqbYbZrYOWEc4fa1HuXuKMOPYEyG8vfu7vak+\n20B49ax5vPT2cta1pBm//4745EP40pX38Pq7q/Iyfg7WAGvjX7P9vNPnNUXVo9JEx5Plm50X31rO\nMWN3WX+7b+8qdtymPy++tby9p7fN7EuR0ZHQIiLSI2rqG+4gdCXI5ya8NDCrsa72mDyOWbLcvTfd\nDOEvRTsd9Co7HJ3rUoofn3YIDy56i1sfeqHD50Tp1ubtefuGPdMv3Ut+wuw6MytIkKmpbxgHzGKz\nJTFtVzmmjN+boYOqufTvT9LSmmZQv9787tyj+N/bnuDBhW9yxlEjOWC3bfn67+5vb/hlwNGNdbVa\nSlFkNGMsIiI95RLS6UOJooF5HHMlcHEexytp8ea7tUC705TZ2CgQ5hSM03T+jicdpZrfYNgv/3DB\np0shEOZ8laP+pkc499jRnH/Sgcx79T0uvPmxjsbe5CqHFA8FYxER6RHjWuc88lS0z7rV6b5poigf\ns8YtwAJCiJP8aTcQbmxA317su/PWPPHiO7S0hqUUB+y2Lb9pfKazsUsmEDbW1TbX1DfMZrOrHDPu\nXsiMuxe2+5rHnl/CZ3+TsWUdhPcQs4u9M0el0gEfIiJScO5+RB/WPjoi/fwt5O+gj2bg1Ma62nLo\nG1w04sA2m3Y2S7bpVZXizA/vw43nHcOfv3UMJx6yO37jI7z6TsZl3aUYCC8h/2vVdZWjiGnGWERE\nCibejPYd4GvAZ39m37qtpr7h78AMutdnuAmY2lhX+2weypQtXQIcCrS77GXpqjV89er7ch2zFAPh\nTMJVibHkpw+3rnIUOc0Yi4hIQbj7DkAjcCxwsJndBtBYV3szMAVYRe69jVvi102Jx5HCaAuE+eo9\nXZKBML4aMZlwdSIfdJWjyCkYi4hI3rn7McCjwAPA0Wb2ysaPx6F2LDAHWEGGy/axdPy8OcAYheLC\nyncgjNKt6ar0uk+WYiBsrKtdBEyl+0uAdJWjBKhdm4iI5E3cLsyBM4GpZnZnpufX1DekCJubzicc\nQ9xE2OhURZhlTBOWXMwmXIafVYrhqlTV1DdMorvLXtLppr3SLz63PW8vAqaY2Yp81deT4r+L6YS+\nxrksq2ghvMGYqjd0xU/BWERE8sLdhwPXEVqFnWFmb+by+pr6hr7AaMJRudWEAxCeAZ4qsQ1bZSUf\ngfDw1of/DvwGeB9w/OZXEEpFTX3DCOAGYCThdMFM3VXShHXVCwjLJzRTXAIUjEVEpNvc/WTgCsKm\nrZ+ZmWZ1y0g+AqG7R8C3CBsxTzKzhwtadIHoKkd5UzAWEZEuc/dq4P8BHwNOM7MHEy5JCiRfgdDd\nTwKuBM4xs5t6pvrC0FWO8qNgLCIiXeLuIwmziIuAz5nZewmXJD2ku4HQ3Q8CbiUsr7iwUMc6i+RK\nwVhERHLm7lOB/wXqgCsUbCRX7r4TIRw/Q3hjpRlWSZyCsYiIZM3dBwKXA+8HJpvZEwmXJCXM3fsD\nfwR2AE42s7cSLkkqnPoYi4hIVtx9LPAwYT3pOIVi6S4zWwWcSliX/B933y/hkqTCacZYREQyirsJ\nnEPoT/x1M7s24ZKkDLn7GYSNnFPNrDHpeqQyKRiLiEiH3H0b4CpgD8LSiYUJlyRlzN2PBP4M1JvZ\n5UnXI5VHwVhERNrl7ocBfwL+BpyvzVHSE9x9L+A2YBbwDTNbl3BJUkEUjEVEZBPuniL0qv0G8Hkz\n+1vCJUmFcfetgRuBVsKViqUJlyQVQpvvRERkPXffHvgncBxhg51CsfS4uCf2x4BngfvdfY+ES5IK\noRljEREBwN0nEFpn/Q74gS5hSzFw968A3wNOMbP7kq5HypuCsYhIhXP3XsAPgE8DZ5rZzGQrEtmU\nu38U+APwTTObkXQ9Ur4UjEVEKpi77wZcB6wEzjCzxQmXJNIudx9N2JQ3AzAza024JClDWmMsIlKh\n3P1E4CFC2PioQrEUMzN7CvgAcDRwfXxqnkheacZYRKTCuHtf4BLgBOA0M3sg4ZJEsubu1YTe2iOB\nE83s9YRLkjKiGWMRkQri7nsDDwA7AwcpFEupMbPVwFTgVuBBdz8w4ZKkjGjGWESkQrj7FODngAG/\nMTP9AJCS5u6nApcDZ5vZrUnXI6VPwVhEpMy5+wDgV8BhwCfN7PGESxLJG3d/P3AL4U3fz/SGT7pD\nSylERMqYu48BHgYiwoEdCsVSVszsv4Q3fVOBK929T8IlSQnTjLGISBly9wj4AlBP6P06PeGSRArK\n3QcB1wKDgI+b2TsJlyQlSMFYRKTMuPvWwJXA3sBkM5ufcEkiPcLdq4CLCB1XjjOzBQmXJCVGwVhE\npIy4+weA64G/A9PiHfwiFcXdPwf8iLCm/q6k65HSoWAsIlIG3D0FnAd8C/iimd2ScEkiiXL3o4E/\nAf9jZlclXY+UBgVjEZES5+7DgD8Ag4HTzezFhEsSKQruPpJw9eRW4Ntm1pJwSVLk1JVCRKSExbNi\njwKPAUcpFItsEK8xPhQ4GLjF3QcmXJIUOc0Yi4iUIHfvRTio42zgTDO7I+GSRIpW3MLt18A44Hgz\neznhkqRIacZYRKTEuPsuwJ2EmbD3KRSLZGZma4DPAdOB/8SHgohsQTPGIiIlxN2PJ7Ri+wVwkZm1\nJlySSElx9xOAq4FzzezGpOuR4qJgLCJSAty9L/BTYBJhg919CZckUrLc/UDChrzfAj/WMdLSRksp\nRESKnLuPAO4DdgcOUigW6Z74aPQPEA4Cme7u1QmXJEVCwVhEpIi5+2nAA8DvgUk65lYkP8zsdeAo\noC8wK257KBVOSylERIqQuw8AfgkcSTjW+bGESxIpS/HhOA5MIXSseCrhkiRBCsYiIkXG3UcDNwIP\nEzYILU+4JJGy5+5TgP8FzjCzfyVdjyRDwVhEpEi4e0RoKfVj4Ftm9oeESxKpKO5+BHAT8BMzuyzp\neqTnKRiLiBQBd9+K0IZtH8LSiXkJlyRSkdx9D8Ix0v8GvmZm65KtSHqSNt+JiCQsPmzgMeAt4FCF\nYpHkmNnzwOHAXkCDu2+dcEnSgzRjLCKSkHjTzzeAbwPnmNlfEi5JRGLxses/ByYAx5nZcwmXJD1A\nwVhEJAHuvh2hBdu2wGlm9kKiBYlIu9z9XKAOOMXM7k26HiksLaUQEelh7n4UYenEk8CHFIpFipeZ\nXQ6cCdzs7mckXY8UlmaMRUR6iLtXARcAnwfOMrPGhEsSkSy5+36ETXl/AurMrDXhkqQAFIxFRHqA\nu+8MXAesBabGp26JSAmJl0DdArxB6He8KuGSJM+0lEJEpMDcvRZ4BLgdqFEoFilNZvYWYTPeKuBu\nd98p4ZIkzzRjLCJSIO7eB7gQ+ARwujbuiJSH+DCe7wJfBE7Uke3lQ8FYRKQA3H0v4HrgNeAzZrYk\n4ZJEJM/c/RTgN8DnzOyvSdcj3adgLCKSZ+4+GbgM+BFwmZnpG61ImXL3Qwjrjn8JXKL/76VNwVhE\nJE/cvT9wKfBhwrHOjyZckoj0AHffFbiV0Ibxi2a2JuGSpIu0+U5EJA/cfX/gv8AA4H0KxSKVw8xe\nBo4EhgC3u/uQhEuSLtKMsYhIN8SbcD4L/AQ4H/i9LqWKVKa4V/mFwMmEY6TnJ1yS5EjBWESki9x9\nMPBbYD/C0om5CZckIkXA3c8mvFk+3cxmJV2PZE9LKUREusDdxwGPAu8CH1AoFpE2ZnY1MBm4zt0/\nn3Q9kj3NGIuI5CBeOvF1Qg/Tc83szwmXJCJFyt33Jhwj3QBMM7OWhEuSTigYi4hkyd2HAr8DhgGf\nNLPnEy5JRIqcu28D3AQ0AaeZ2fKES5IMtJRCRCQL7v4hQiumecCRCsUikg0zexc4lnDYz33uPjzh\nkiQDzRiLiGQQ7zL/H+Acwgl2/0y4JBEpQRstw5oGnGxmDyZckrRDwVhEpAPuvhNwLZAGppjZawmX\nJCIlzt2PB64BvmJm1yddj2xKwVhEpB3u/lHCD69fAz/RphkRyRd3H0s4Ke8a4IfqfV48FIwLoKa+\noS9wADAKqAZWA3OBJxvrapuTrE1EMnP3PoT+o5OBT5nZ3QmXJCJlyN13AP4GPEtYprU64ZIEBeO8\nqalvSAETCWuHxhN2n0ZAFdBCuBTbD5gNXALMbKyrbU2mWhFpj7vvCfwJeBP4tJm9nXBJIlLG3L0f\n8HtgN+AkM1ucbEWiYJwHNfUNI4AbgJHAAEIg7kgaWAksACY31tUuKnyFItIZd/8EcDlhtvgXurQp\nIj3B3VOAAWcCx5vZkwmXVNEUjLuppr5hEjAd6EuYHc5WC9AMTG2sq725ELWJSOfiGZufE674fNLM\nHk64JBGpQO7+KeBS4Ewz+0fS9VQqBeNuiEPxDMISia5qAqYoHIv0PHffj3C15yngC2a2LOGSRKSC\nufvhwF+AnwK/1JWrnqdg3EXx8ok5QP88DLcKGNNYV/tsHsYSkU7E/UQ/DVxEONr5av0AEpFi4O67\nE46Rvgf4qpmtTbSgCqNg3AXxRruHgLHktnyiIy2EkH2INuSJFJa7DwZ+Q/j/O9nMnk64JBGRTcTf\np64HegOfMLP3Ei6pYuhI6K6ZSNhotz4UnzBuOJedfQS3ffdYzjthzPonbr9VPxrravnrt2vWf5x+\n5IjNx6uKx5vQA7WLVCx3Pxh4BFgBvF+hWESKUbys6wTgGeABd98r4ZIqRq+kCyhR0wjdJ9ZbsqKZ\n6+5dxLg9t6NP7y3fb0y6+HZaM8/ODwDOB+7IZ6Eisn7pxFcJRzt/xcxuSLgkEZGMzGwd8DV3Pwe4\nz91PVV/1wtOMcY7iwzvGs1lLtvvmvcED8xezrGlNV4eOgPHx+CKSJ+4+hNBEfwpwqEKxiJQSM/sN\nMBW4yd3PSricsqdgnLsDCJ0kcjL9q0cz42tHc97xYxjcr3dHT2sCRnenOBHZwN2PBB4j9A0/wsye\nS7gkEZGcmdkdhEm5One/MO59LAWgv9jcjSLzAR6bWLpqDV++6l6m/vJOvnzVvfTr24tvn3xQR0+P\ngP3yUaRIJXP3Knf/PvBn4Bwz+5aZdflyjohI0sxsLvAB4AjC7PGATl4iXaBgnLtqcuhEsXptCwtf\nX0prOs17K9dw+T+fZtxe29GvT7tDVMXji0gXufuOwO2ETbIHm1lDwiWJiORFfEz9McAy4G533znh\nksqOgnHuVhPaq3VJmrABL4ranXRuiccXkS5w92OBRwn9PyeY2asJlyQikldm1kzow/5n4D9xtx3J\nE3WlyN1cYIv2EqkooioVkUpFpKKI3lUpWlrT7L3jVqxsXsurS1YysF9vvlSzP3NeWMKq5nXtjZ0m\ntGYRkRy4e2/gR8DpwGlm9u9kKxIRKZz4QKKfuvsC4F/u/gUz0wm6eaADPnIUd41YTmi6vd6UD+3N\n1PEjN3nu9NkLeGXJSj794X3YekAfVjav47Hn3+aqmfN4d2Vze8OvBQY11tW2+6CIbCk+Jep6YAlw\nlpm9lWhBIiI9KJ4x/hvwK+CibE7xjLPMAYR9U9WEq9VzgScrPYMoGHdBTX3DHYTDOLLehJeFNDCr\nsa72mDyOKVLW3P3jhFPsfgpcamY6OVJEKk681vg24AngC/Fyi03Ep/ZOJJzFMJ7QCSsi7G9qIeSQ\nfsBs4BJgZiWexqtg3AU19Q0fAf4CDMzjsCuASY11tTrgQ6QT7t4P+BlQA3zSzB5KuCQRkUTFXSpm\nAEOASfFGPQBq6htGADcQTtkdQOaJvTSwktDmcnJjXe2ighVdhLT5rmtmEr5gurwJbzMt8Xiz8jSe\nSNly932B/xC++b9PoVhEBMxsJfBx4H7CprxRADX1DZOAOcBYwoReZ1e7o/h5Y4E58esrhmaMuyh+\n9zUH6J+H4VYBYxrrap/Nw1giZSk+1vlMwiW+7wFXZbOWTkSk0sQn5F28INrj129HQ84nLJHoqiZg\nSmNdbUVs7lMw7ob4XdQM9AUnUlDuPgj4NfA+YLKZPZVwSSIiRe0cv/y0F6Ldrm2NUvnYD1UxE3ha\nStENcZidQviCyXVZRUv8OoVikQzc/SDgEaAZOEShWEQks5r6htRzqd2/1UqUr81zfYEb4w18ZU19\njLupsa725pr6hifo2qL2Uyvh3ZdIV8RLJ74MXAB81cz+lHBJIiKlYiIwkijK+qTeTlQRMs4EoKyb\nBCgY50FjXe2imvqGQwhfMOfTeRuUiwmt2SquDYpINtx9W+AaYBfgMDOrqF3R+aA+pSIVbRphoq5d\nf/12zSa3+/Sq4u8Pv8ivG5/ONOYAQsYp62CsNcYFEP9AGg3sx4YfSM8AT+kHkkhm7n4EcB2hJeJ3\nzGxNwiWVDPUpFZGODiLrSHXvKq7/5kS+/6eHeOqldzp7etkfRKYZ4wKIv2AeiT9EKkJ3ZyjdPQV8\nB/gq8Fkz+3sByy07HfQp7egH4wTgUGBBTX1DxfUpFSlzBxDeFGcVjD84agfeW7kmm1BMPO5oyjjf\nKBiLSJdlO0NZU9+QcYbS3XcAphM2eIwzs1d65k9QHuIOOW1/f9msKdy8T+lUbQIWKRujyOFk3mPG\n7MLMJ7L+lhsRroaXbTAu+92FIlIY8QzlQ4QlDxMIsxODgUGE/t6D4tu948f/AjwUv249d/8I8Cjw\nAHC0QnFuNmob2Z/sQvHGquLXzai0Jv4iZayaLL8XDNuqHwcMH8Id2Qfjqnj8sqUZYxHJWT5mKA9v\nffg24IfAVOBTZnZXoeotV/GbjOl0r5c68eun19Q3zFGnHJGSt5osW8hOOGBnnn75HRa/15Tt2C3x\n+GVLM8YikpO8zFCm09cuZsiTwIGEY50VinMUL2O5gfDmJB8qpk+pSJmbS1jG1qmJY3bmjjk5XaRL\nE5oJlC3NGItI1vI2QxlF1c8xfM/n2e24f15wwpt5Ka7yhD6lGd6cnH/SgRy0xxD69q7i3RXN/Pn+\n5/jX4y939PSK6VMqUuaeJIvv0fvtsg1DB1Vzz9zXcxm7H1DWhyxpZkBEspLvGcp0lEq1RlU3aIay\nyzL2KQW44b5FnHXZXUy6+HZ+cMPDnPnhkYzYYXCml7T1KRWREhV3AZpNJ7PGE8fszL3z3qBpTdYH\n96aB2eXcqg00Yywi2dtihvKEccM5Zuwu7D5sEP9++jV+dusTAOw2dCDTThzLjtuE3Lbo9aX8uvFp\nXnp7xcbjaYayi+LWeOPpZOf5i29t+PtOA+k07LTtABa9sayjl0TA+Jr6hr7l/sNPpMxdQmjJOLCj\nJ/zyHzlP/K4kHFBW1hSMRSRbW8xQLlnRzHX3LmLcntvRp/eGid8ly1fzk5sfY/F7qwA4ftzufHfS\nQZzz23s2H7MiTlIqgKz7lH75o6M5ZuwuVPeuYuHrS/nvwk5XrpR9n1KRCjATWEDY8JyPY6Fb4vFm\n5WGsoqZLmCLSqY5mKO+b9wYPzF/MsqZND6db2byO199dRWsaIKI1nWanbdu96r9+hrIwlZetrPuU\n/uqfT3HyRf/im7+/n/vmvcHalk4PumvrUyoiJSruFz8ZyNeVn2bg1Eo4KVPBWESy0TZDmZO/TPsI\nf//esXzp2P25/t4OD1drm6GU7GXdpxSgNQ1Pv/wu2w2u5riDh3f29LLvUypSCeITLafShe/dm2kC\nplZKK0cFYxHJRk4nKbX5+CW3c/LFt3P5P5/m2czrWjVDmZus+5RuLJWK2HGb/p09rez7lIpUivhE\nyylRunUt6Zwne1uAVcCUSjoZU8FYRLKR0wzlxprXttDwyItMO3EsW/Xv095TNEOZu077lG7Vvw/j\n99+R6t5VpCI4eM+hfHj/nXj8hbc7G7vs+5SKVJLDWx+edWD66VUDaCKVbmklne6sx3EaWAHMAcZU\nUigGbb4Tkex0aYayTRRF9O1dxdDB1SxdtWbzhzVDmbus+pQed/BwvvqxA4gieHNpE/93+zP8Z0Gn\nm+/Kvk/htRl6AAAgAElEQVSpSIX5Rj+atxqTnsuL0c71r0U7HkHYM9JEuGJXRfg+nCb8/59N6D4x\nqxLWFG9OwVhEstHuDGUqiqhKRaRSEakoondVipbWNAfuPoSlTWt4fvEyqnv34swPj2TF6rW89NaK\ndobWDGWuGutqm2vqG2YTWt21u8Rl6ao1TPvjf3IduiL6lIpUCncfAnwTIIJHd0+/6r+74LPpeMPz\naMIytmrC5MQzwFOV/v9fwVhEstHuDOXpR45g6viR629PHLML02cv4MW3lvOlY/dn6OBqmte2MP+1\npfzPdf9tvyNCOj1wv/SC16G2kPWXo077lHZBRfQpFakg5wOD4s+/b2ZpWH8IyCOoLeMWos6XmoiI\nQE19wx1kmKHsknSarVjG/umFa4G/AlcDM82sy8s2KkV8YuBD5LdP6RzgkEq8fCpSbtx9B+A5wqTG\nfcCRbcFYOqbNdyKSrUsIM4r5E0Urqmj9PHA5IXT/C3jO3X/g7p32Fatk6lMqIp34Lhuu9H1foTg7\nmjEWkawUeobS3fsCJwJnA8fEz7mDMIv8NzOr6HVvHampb5gEzCCLzXgZNFFhLZlEypm77wYsBPoQ\nrsId08lLJKZgLCJZq6lvGEE6PYco6rQZbhZWEVoBbdE0Pp4t/nT8sRuwhBD+rjazJ/Pwe5eVOBxP\nB/qS25uWFsJM8VSFYpHy4e6/BT4X3zzMzHLeiVupFIxFJCef8yv++kq044mtUbcmjbOaoXT3KsIS\ni88CJwG9gf8SZpGvN7MOTw2pNDX1DSOAG4CRwAAyrQUP3/dXE0XPEJZPVMSJViKVwN1HAPMIb5L/\nbmbHJ1xSSVEwFpGsufungWveZuuWBdFe64iiXvTQDKW7DwWmEELy/oQZ5xsJIfk+rZ9bv9xlAmEn\n+njS6dUpWtt2pBORppUUg1nOtun3rns+NXyq1hSLlBd3n074XglwkJk9nmQ9pUbBWESy4u5HArMI\ns7afuz817t9kO0MZ+uOuBBbQzRlKd4+A9xPWIp9GaFc2nxCQ/2hmi7s6djlp61O6V+vzd0I0OKKV\n/qymP02kQkvqv5rZyQmXKSJ55O77EQ7oiYA/m9mpCZdUchSMRaRT7r4HYQnDUOBSM/sGtDND2cMn\nKbn7QOAThJB8BLAO+DtwFdBoZuvy9XuVKne/E/hwOw8tMrO9e7oeESkcd78J+DjQCow2s7kJl1Ry\nFIxFJCN3H0zogTma0E7t+PYCZ9InKbn7voSAfAYwDHgN+B1wjZk9V+jfv1i5+y+Br7TzUBoYaGar\nergkESkAd38fGw7s+KOZnZlkPaVKJ9+JSIfizW/XEQLvXOCTHc3CJn2SkpnNA6a5+/eA4whrkb8L\n/I+730WYRb7FzJqSqC9BT3dwfwTsCzzag7WISOH8MP51HeBJFlLKFIxFJJOfEs5qfocwU7w04Xo6\nZWZrgVuAW9x9F+BMwkzytcB77n4toe3bYwmW2ZOeyvDYaBSMRUqeux9G+F4N4ftbxV4l6y4FYxFp\nV9yB4luE2YePm1nJtfQys1eAH7v7hcBRhID8WeBcd3+UsGHvOjN7L7kqC66jGWMI3T1EpPT9KP61\neaPPpQu0xlhEtrBZB4rPm9mVCZeUN+6+LXA6ISCPJayFvokQkmeXY9s3d38F2Lmdh/5hZrXt3C8i\nJcLdjyZ8vwb4hZl9Pcl6Sl0q6QJEpLjEHShuJoTiS8spFAOY2Ttm9ivgIGAcYYPe8cBdwEJ3/667\n75RkjQXQ0XKK0T1ahYjkVdy+sm2GeBVwYYLllAXNGIvIeu4+CLifTjpQlBt3709ocXQ2oe1cK/AP\nwixyQ7xuuWS5+8+Ab3bw8FY6QVCkNLn7x4CG+OZPzey7SdZTDrTGWESA3DpQlJu4Zdl0YHp8nOpn\ngLMI3S0Wu/sfCBtaFiRXZbdk2oC3H/CfnipERPJjs9niZcAlCZZTNhSMRaTNTwlBsGQ6UBSCmS0C\nvufuFwAfJcwinwec7+73EGaRbzKzlQmWmavONuApGIuUnkmEJWEAPzOzd5IsplwoGIsI7n4WJd6B\nIt/i2fLbgNvcfUfCwSFnA78HLnP3PxF6Iz9cAhv2nsnwmNYZi5SY+ApfW9/iJcClCZZTVrT5TqTC\nufsHgd/GN79kZv9OsJyiZGavm9lFwD6ENci3AFMJx2TPcfevufuQJGvMxMxWAC908LBatomUntMI\ny6AALtI+gfzR5juRCubuuwMPAUNRm5+cuPtWwCcJbd/GAWsIgflqYJaZtSZY3hbc/TbCUpnNvW5m\n5daFQ6RsuXtvwj6QvYDFwJ462j1/NGMsUqHiDhS3EULxvwhLKSRLZrbUzK4ws0MI/ZD/D/gIcDvw\nrLtf4O67JlrkpjragLdj3NtZRErDmYRQDPBjheL80oyxSAWK16f9lTCDOBc4rFI32+WTu1cDJxHW\nIk8E0oSgfBVwq5mtSbC2KYTOG+35kJnd05P1iEju3L0vsBDYFXgZ2NvMmpOtqrxo851IZboQdaDI\nOzNbDVwPXB8flPLp+OPPwNvuPp3Q9i1Tl4hCydSybTSgYCxS/D5PCMUAP1Qozj/NGItUmLgDxe8I\nHSiO0Wa7wopn548hrEU+gXCi4H8Ia5FvMLPlPVRHNbCS9pfQXW5mX+6JOkSka+KDiJ4DtgeeBUaV\n+uFDxUjBWKSCxB0o7iSEs8+X23HPxc7dtyN0s/gsMIoQVG8ghOQHCt32zd3nAyPbeWi2mR1VyN9b\nRLrH3c8HLopvTjGza5Osp1wpGItUCHWgKB7xiVWHEtYifxIYQFjrfTUw3czeLNDvezNwcjsPLQG2\nK4F+zCIVyd0HA88D2xL6ko8xs5ZkqypPCsYiFSDuQHE/YS1pI3BcpRz3XOzif5tTCSH5MMISl78R\nQvLt+fzh5+4/BOoAWolYRT9WUU2aFK9EO3y5Oap+EHiysa5W6xZFikh8EqfHNz9uZjcnWU85UzAW\nKXPqQFE63H0/QkA+gzCz/wphPfjvzOz57o5v/sPJyxh0/avR9ixjEClaSRMB0EqqiShaC/QDZgOX\nADMb62qLqh+zSKWJ2yk+DwwGHgMO1tWdwlEwFilz7n4xMI3QgeL9Ou65+Ll7H8JGvbOBGiACZhFm\nkW+Ju1/kpKa+YUQq3fI3YL9WUhBFmZ6eJqx/XgBMbqyrXZTr7yci+eHuFwLfiW/Wmtk/kqyn3CkY\ni5QxdaAofe6+G3AW8BlgOPAuMIPQ9m1ONmPU1DdMAqaTTvcliqpy+O1bgGZgamNdrS7divQwd9+B\n0IGiP2E53Ac1W1xYCsYiZWqzDhRfMLPfJlySdIO7p4CjCbPIk4A+wMOEWeQ/dbQ8Jg7FMwhLJLqq\nCZiicCzSs9z9UuBr8c2jzeyuJOupBArGImVIHSjKm7sPAT5FaPt2ACG4/pkQku9pm1GqqW8YAcwh\nzDZ11ypgTGNdrZbiiPSA+Ej5RYQ3wXea2YSES6oICsYiZUYdKCpH3PZtHGEW+TTC5pyFwDVrqfrj\nQ6mDbgPGArksn+hICyFkH6INeflRU9/Ql/DGZhRQDawmbJBVZxDB3a8gnHQHcLiZPZBkPZVCwVik\njGzWgWIecKg6UFSG+FSsUwizyEe+y+DWedGI1nSU6gVwwrjhHDN2F3YfNoh/P/0aP7v1ifWv7dsr\nxeeO2Y8P7bcjvVIRzy1exrf++J/2fpsVwKTGuto7euCPVJZq6htSwETChtjxhNn+iPDmpYWw8VGd\nQSqcu+9F+B7eC2gws+MSLqli9Eq6ABHJqwsJofgd4HiF4sphZquAPwJ/dPeRL0S7NqaJdm97fMmK\nZq67dxHj9tyOPr03PRX6a8eNoSoV8bnfzGZ50xr23H5wR7/NAOB8QMG4C+KlLTcQTh8cQAjEvTt4\n+gTCITALauob1Bmk8lzAhoxWl2QhlSbV+VNEpBTEHSimETpQnGJm+kFaoe5PjXuxKeq388Yt2e6b\n9wYPzF/MsqY1mzx31yEDOHTkMH7x9ydZumoNrWlY9MayjoaOSKePipcASA7iTZBzCEtbBgIZ++XF\njw+Mnz8nfr1UAHcfBUyJb95kZo8lWU+l0YyxSBlw9yOAK+Kb52rncsVr25DX0WzkevvsvDVvLm1i\n6vi9mTBmF95ZsZoZsxdy77w32n1+FS299m9d8J77w+8QWse1/brxx+b3rb9tZmu7/8crLd3sDFJF\n2Dw5o6a+QZ1BKoMTJi7TgCVcS8VRMBYpcXEHilsIO5d/qbZsQtjM1dmMJABDB1Wzx7DB3Dv3DU7/\n+UxG7bIN9acdwotvr+Dlt1ds8fw0Eauorh7Iqp2AnXItzN1XkmOYjj/eK8VNpPHyiel0r10e8eun\n19Q3zFFnkPLl7gcCn4hvzjCzZ5KspxIpGIuUsLgDxW3AdoQOFOclW5EUiWqy7ETRvK6VtS2tXHfP\nIlrTaZ586R3mvLCEg/cc2m4wBkh3bxXegPhj11xf6O7LyC1Mt91eamY9voEt3mh3A5CvpSd9gRtr\n6hvUGaR81ce/thBmjqWHKRiLlKi4A8W1hLZs84DJpTijJgWxmvCDtVPPL95yPXFnvYoiEstkg+OP\n4Tm+Lu3uS8kuTG9+37JunDQ2kbDRLh/t8ojHGUnYmKcNkGXG3Q8lbJ4GuMbMdGUgAQrGIqXrJ8Dx\nqAOFbGkum+XbVBRRlYpIpSJSUUTvqhQtrWGG+K2lTXzyg3tx/b3Psu/OWzN2+BCunjm33YEj0vRn\ndU/8GfIpAraOP/bI8bWt7p7rso9wX3TwNKJoQGe/wfj9d2TKh0YybHA176xo5me3zuGpl9/t6Onq\nDFK+fhT/uoYNM8fSw9THWKQExR0ofkfoQPERbbaTjcVdI5az0ea7KR/am6njR27yvOmzFzDj7oUM\n324gXz9uDHsOG8TipU38/q753D9/cfuDp9Nr904/v+N2vDMQ2Gajj203u93RfVmtfS51rUQ8GB1E\nOsq87OR9ewzl68cdwE9ufoz5r77HtoPCqoslyzOe77EWGKRDQMqHu38YuDO++Usz+1qm50vhKBiL\nlJi4A8WdhM12XzSzKzp5iVSgmvqGOwiX3PMZRNPArMa62mO68mJ3TxGWQuQSpttub9Xd4nvSCvrz\ndDSSlijzhdmfn3U4/3r8ZRoffzmX4ZcBRzfW1T7SnRqlOMQnWN4DHEE4en0vM2u/LYwUnJZSiJSQ\ndjpQKBRLRy4hHBAxMI9jrgQu7uqL4w1w78Ufz+fy2nhN/VbkFqbbPgZ1teauWkU16U7ek6Qi2Hun\nrXhgwWJ+d+5R9O6V4oH5i7ly5lzWrMu4jjsC9gMUjMvDsYRQDHCZQnGyFIxFSkTcgeJW1IFCsjMT\nWEA6fSBRJ9fzs9MCLABm5WGsnJlZC2Et7zu5vtbdexPWF+cSpttu9+9Kvdl07th6QF96V6U4ctQO\nnPeHB1jX0soPJo/j9CP35vd3zc8weLqKKKruSl1SXOLZ4ra1xcsIb2glQVpKIVIC4tmyWwib7eYB\nh5nZe8lWJcXuC/6bSS9Fu/ylNS+5mFXAmErroevufcg9TG/zJkOGPhft1rs16rghxcDqXvxlWg2X\n/O1xZj7xKgAf3HcHTjtyBOdeeW+Hr0ulW9LD068+uyNv3kvYaDkv/vV5daYpLe5+MtB2aMsPzEwt\n2hKmGWOR0rB5BwqFYsnI3T+4E/zfSvr/+C2GfpPuHTDRBEyttFAMYGZrgMXxR9Zq6hvGkU7PIqyp\nbteK1et4a2nTJvdlM1UVkY4GsWIEMGKzh9a4+0I2BOW20DzfzFbmUr8UXjzh0dZ94h3g0gTLkZiC\nsUiRc/czCe2Z1gGnmNmihEuSIufuE4A/AafPuODMmTX1DY8STl/rS249dVuAZkIo1lHEuXmSKOr0\nzcjtc17hhEN256FFb9HS2sqkD+zBgwvfzPiaFqrW9WHtR4G9CKccjgL2BXYD9o8/NuHuL7FpWG77\n9a1u9GmW7pnMhn+ri9VyszhoKYVIEVMHCsmVu38M+D3wcTO7p+3++GjiGwgHRAwgc7eKNGGj3QLg\n1EqcKc6HbDqDVKUizqnZnw+P3ok161q4+5nXuWrmPNa2dLj5rsPOIO4+kPDvu3FYHgXszUat+zbz\nDlvOMM8FXozXdUsBuHsvwt/zCMLViL00q18cFIxFilTcgeK/hM126mspnYrXK/4fcIKZPbj54/ER\nxRMIVyDGE5ZIRIRZ5BZC6OoHzCZ0n5ilo4e7rqa+4SPAX8hvZ5AVwKTGutqsD/iIQ9iebAjKG4fm\njpZ6rCa8Mdo8NC8ws6YOXiNZcvezgavim18zs18mWY9soGAsUoTiDhT3AQcQOlAcp001kom7nwb8\nL/AxM3uss+fHh4CMJrT9qiYEoWeAp3RwRH7Eb0QeAsaSn2OhW4A5wCH5eMMSd0TYgU2DctvnO3fw\nsjTwApvOLs8F5pnZku7WVAncvS/hTcduwMvA3mam/3NFQsFYpMjEGzJuBk4A5gOHarOdZOLunyFs\n4vmImT2ddD2yQbyEZQ5dbPu2mR7rDOLug4F92HKGeQQdh/y32HT9cltofjnuYV0x4jeeBxD+ztre\neM4Fnjy89eHPAZfFT/28mV2ZTJXSHgVjkSLj7hcRLnW/C3zAzBYmXJIUMXc/F/g2MNHMFiRdj2yp\npr5hEjCD7ncGmZL0Jsi4fd1ebDnDvC8dLxlZRXiTv/myjIXlNFMaXyGYCEyjo6VK6XT/waxo3SX9\nep+tWPZsBKPMbG1yVcvmFIxFikjcgeL3hA4UHzGzu5KtSIqZu58HnAtMMLOcTpKTnhWH47LtDBIv\ny9iZLWeY9yUs12hPK/AcW3bKmFtqV8ly2tyaTpOilRStL6yLeh/TWFerTkNFRMFYpEi4++HAXagD\nhWTB3b8PTCWE4leSrkc6V6mdQdx9GzbMKm8cmveEDo8IfIMtl2XMA14ptvZyXX7Tk063EEVF/6an\n0igYixQBdx9O2KSzHXCZmX014ZKkSG10hOyJhOUTbyRckuRAnUE2iDeh7c2WM8z70vGykxWEgLx5\naF6UxJKEclomI4GCsUjCNutAcTtQqw4U0p44FP8vIVB9xMzeTrgk6QZ1Bmmfu6eAXWl/WcZ2Hbxs\nHfAsW84wzzOzZYWos1Q3VkpmCsYiCYp/ANyCOlBIJ+KvlV8DBwIfNbN3Ey5JpMe5+xC2DMujgN3p\neGnKq7S/LOP1ri7LKPZWfNJ1CsYiCXL3nxI6CqgDhXQobuF3NbAHoaf18oRLEikq7t6PDaf+bRya\n9yGs/W3PMto/9e+5zq7adXZ4S++qFF/+6GgO2mMIg/r14fV3V3LNnfN5+Nm3Mg2b8+Etkn8KxiIJ\n2awDRY2Z3ZlsRVKM3L03YWPPtsBJZrYq4ZJESkb8pnJ3tpxhHgVs08HL1gILaX9Zxkro/Ljvvr2r\n+MRhe3LHnFd4c2kT7997GN85+SC+eMXdLF7a4cGBHR73LT1HwVgkAepAIdmINyfdQLhU+wkzW51w\nSSJlIV6vvx3tL8vYLcNLX24hmvdg9L4JRFFHHTXa9ZvPH8m1dy/k3nkZ98uuBQZV8hrzpPVKugCR\nShN3oPgrIRRfplAs7XH3/oQTEFcAp5rZmoRLEikb8driN+OP2Rs/5u4D2HDq38aheSSwaxP9dq2i\nhZYcItTWA/qwy5ABvPhWp6ugmggbMh/JenDJKwVjkR4Ud6C4jTBTcTvwzWQrkmLk7gMJXyevAmep\nS4lIz4mXSzwaf6zn7r2APV+Ltv9iK6kv0fHa5U1UpSK+c9JB3DHnFV5esrKzp0eELiUKxglRMBbp\nIXFXgRmEtmzzgckKPLI5d98K+AehbdcXzawl4ZJEBIi/Xy+oqW+YS+gi0akIOP+kA1nb0srl/3o6\nm5dUEVr3SUJyWh8jIt3yE0JbtneB49WWTTYXt6KaRZgt+oJCsUhRWk2Wwfibx49hmwF9qb/pEVpa\ns9rT1RKPLwlRMBbpAe5+BqEt2zrgFLVlk825+zDChsxZwNfMTL1MRYrTXEIHiYy++rHR7Dp0IBdc\n/xBr1mX93zlNuFokCdFSCpECiztQXBnf/Irassnm3H1nYCahA4V39dABEekRT9LJEdDDtupH7cHD\nWbOuheu/OXH9/b9oeJK7nnot00v7AU/lpUrpErVrEymguAPFQ4TNdpeZ2VcTLkmKTPw1Mgu40swu\nSroeEelcZ32Mu0h9jIuAllKIFEjcWeBW1IFCOuDuIwiton6hUCxSUi4BOm0xkaOVwMV5HlNypGAs\nUgBxB4prgTGoA4W0w91HAf8GfmxmlyVcjojkZiawgCw34WWhJR5vVp7Gky5SMBYpDHWgkA65+1jC\nD8DvmtmVnT1fRIpLY11tKzAZyNcJdc3AqfG4kiAFY5E8UwcKycTdxwGNhM4T05OuR0S6prGudhEw\nlXBaXXc0AVMb62qf7X5V0l3afCeSR3EHirsIxz2fY2b/l3BJUkTc/QjgFuBsM7st6XpEpPuO/eFt\npwA3piEiymm+sYUwUzy1sa725oIUJzlTuzaRPIm7C9xCCMW/UiiWjbn70YR2bJ8ys9uTrkdE8uOw\n9KPbNtE3WhDtSVO6mlZSaaIoU7eKNGGj3QLC8gnNFBcRBWORDGrqG/oSjnAeRTimczWhufuTjXW1\n69eWbdSBYhihA8U3er5aKVbu/lHgD4SlNbOTrkdE8sPdBwDej2bGpOfyOsOueSG1227AeMISiYhw\nzHMLIRD3I3SiuZjQmk1riouMgrHIZmrqG1LARGAaGb651dQ3zAYu2SX92qzdYAbqQCHtcPeTgCuA\nE83sgaTrEZG8+iawA0AEr+7Em1+5ou6cVfGkymhgPzZMqjwDPLXxpIoUH60xFtlITX3DCMLl7pHA\nADI3b08DK/ukm1fsn16wQz+a3wU+oM120sbdJwO/AD5mZo8mXY+I5I+7bw8sAgbGd51tZtckWJLk\ngWaMRWI19Q2TgOlAX8LscGciYOAaeg+cE+3Htrx36bUXnKFQLAC4+1mEtn0TzUxHvIqUnwvYEIqf\nJiyXkhKnGWMR1ofiGYT1X13VBEzR7mJx93OA7xFC8fyk6xGR/HL3fQhhuG0SpdbM/pFgSZIn6mMs\nFS9ePjGd7oVi4tdPr6lv2Kv7VUmpcvdvAOcD4xWKRcrWT9gQiv8N/DO5UiSfNGMsFS3eaPcQMJbs\nlk90pgWYAxyi3caVx92/B5wFTDCzlxMuR0QKwN0PA+7f6K73m9lDSdUj+aU1xgWQbYsvKQoTCRvt\n8hGKiccZCUwA7sjTmFLk3D0C6oGTCTPFrydckogUQPx//ZKN7rpeobi8KBjnSa4tvoCZmlEsCtMI\n3Sc6tOvQgXz52P3Ze8etWLpqDVfOnMv98xdneskAwqV0BeMKEP+g/H+EN0NHmdlbCZckIoVzInBE\n/Pla4H8SrEUKQEsp8qArLb4IJ95Mjs9alwTEM/vLgd4dPScVRVx5zodoeOQl/vrf5zlg+BB+OHkc\nX7ryXl59Z2Wm4dcCg3SFoLy5ewr4FXAwcKyZvZtwSSJSIO7eG3iK8LMe4FIz02FOZUab77op7mYw\nh7BGdSCZQzHx4wPj58+JXy/JOIAws9+hXYcOYMigam5+8Hla0zDnhSU8/fK7TBizc2djNxGau0uZ\ncvcq4CrC19ExCsUiZe9sNoTiZcCPE6xFCkRLKbqhmy2+qoD+wIya+ga1+CqgeFZvELAVMDj+davt\not1r32LbPkS5vT+MIth9u0GdPo1w4tEjuVcsxS6eOfojsB1hpjjj5QMRKW3uPhD4wUZ3XWhmbydU\njhSQgnEXFaDF15zGutpnu19ZeXH3ajYNtOuDbQeft3dfuyl2cHoFS6JtyLTQ+5UlK3lv5Ro+cdie\n3Pzg84zdfQgHDB/CnBeWdFZ6FWHjpZQZd+8L/IlwEMzxZpbxqoOIlIXzgO3jz18hnGgpZUjBuAvi\njXY3EH4w5kNf4Maa+oayafEVX2YeRObAmk3I7VOoGqOMkThoaU3jNz7Ml47dn1MP34sFry/l7mde\nZ+26Tl/bQuhGImXE3fsBfyEslTnZzNYkXJKIFJi770DYqN2mTm+Iy5eCcddk3eJrp237c8UXPsQ9\nc9/g4r8+3tHTiqbFV7zDvi+5z8pufl+naw3yqAlYSljztfGvGe9bFg3apZXUNZ3V+vyby5n2x/+s\nv/3zsw7njide6aymNPBMV/4wUpzcfQBwK/AGcKaZrUu4JBHpGcaG7kVPEq4WS5lSMO6aTlt8tfny\nsaNZ8NrSbJ7a7RZfG83SdnfpQYddGvKslSxDbIbHl3d11i7uStHpcoc9hg3ilSUrSUVw/Ljd2XZg\nX+6Y02kw7kfYvSxlwN0HA/8A5gOfN7OWhEsSkR4QH/38uY3u+rb+/5c3BeMcxWFqPJ13n2D8/juy\nsnktz7zyLjtt22mOjkinj/q2X7R/f1b3p2tLDwZ27U/VJW2ztDnP1G70+UozS6xfYGNdbXPcV3oC\nGf49JxywM8cetBu9qiKeeukdvnvtg6xtybCUIp1OE0Wz1aqtPLj7tsC/CCckfsXMymK5k4hk5UI2\nXB2+k/C9QMqYgnHu2lp8ZZxV7d+nF2eMH8m3pz/IsQftmtXAVbT0aiVV6FnGVnKfld38vmVmtrbA\ndfaUS4BDyfCm4qpZ87hq1rysB0zR2jog3XRNHmqThLn7MMJVnDuAaUm+kRORnuXuRxBOs2xzvr4H\nlD8F49yNIovZ4jOOGknj4y/z9vLs91+liVhFNQNZ1dFTVtH9pQer9B97EzMJh62MJR/HQqdb6cfq\nqtHpeZe7+xoz+0u3x5REuPtOhK+PmwDT/xuRytHO0c/XmZnab1YABePcVdNJgNpz+8G8b8+hfOm3\n9+Q0cCvRmveiraYPS7/zN7YMtuU0S1s0GutqW2vqGyYTDmnp393xUqTZJ/0cEWwD3OTu1wBfM7MV\n3R1beo677wbMAq4xswuTrkdEetzJwGHx52uA7ydYi/QgHQmdo5r6hqnA5WToZHDy+3fnrA/vw6o1\nYZFAhIAAACAASURBVNN6vz69SEURL729gi9fdW+m4ZcD5zbW1WrHaw/r5mEtAKTSLYxIP89Q3tv8\noUXA6Wb2UDdKlB7i7nsRZop/YWaXJl2PiPSsdo5+/rmZfTPBkqQHacY4d3MJrbg69I9HX+LfT7++\n/vYph+3J9lv347J/dLp8WC2+EtJYV3tzTX3DFEIbnr7ktqyiBWgextu/Hcp7nyFshtzYCOB+dzfg\nIu1oLl7uvi9hPfGPzOyKpOsRkUR8lg2heCk6+rmi5HYWrkDoYZhxVrF5XSvvrmxe/9G0Zh1r1rWy\ndFWnXcXU4itB8bHcYwnLKlbQyRug+PEV8fPH/OGCz3wDOBC4v53n9iJ8c70rvkwvRcbdDyDsOv++\nQrFIZXL3QWx69PNPzKzTo06lfCgY5yhuwTWbzkPTejPuXpjpcI82aUAtvhLWWFe7CDgEmERYY/r/\n27v3OCureo/jn2cPw1y4CSoIoogCCnKRBDVTsQTHGjPlmCaCl8yytLLM26lxtZpTphzrHLWTZuUF\nxEupFWfKEUxJ0QwMuQiIIMpRgVCU68ww7HnOH+uBYYa99+w9s2c/+/J9v16+YO9Z+5nfM77Y89tr\n/db6NeJqvLfhNj9uCx43Bl+fDIzf087bGLMWd5zfLbiZ5NZOBZZYay/s3DuRVFhrj8fNFF9rjHkw\n7HhEJDTfA/oGf38XuCvEWCQEqjFuh4rqmjNxbWHTeW7wdmBybVVlqJ3vpKXg3OqRwAjcxst6XLnL\nsrY+xFhrPwk8DAyOM+Qh3Lm4W9MXsaTKWnsy8AfgSmPMH8OOR0TCYa3tD7xJcwOvy/RBufAoMW6H\niuqaCO6w//Qc8eVmFhfjZh7VPCCPBB3T7gQujTPkLWCqMeblzEUle1hrTwceBy4xxujgfpECZq29\nB/ha8HAJ8AntCSk8SozbqaK6ZghpOuILt0Q/es9yvOSfoHTiXlyHwtaiwI9wtWy7MxpYAbPWVuA2\nW15ojHku7HhEJDzW2uG4PUR7JrvOMsbUhhiShEQ1xu0U1KJOw3XB64g6YJqS4vxmjHkMGA38LcaX\niwALzLPWxiu7kDSy1n4BlxSfq6RYRGjZ+nku8EyIsUiIlBh3QHCKwVTcjG+qyy3R4HVTg+tInjPG\nrAM+A/w7EGtm+GRgsbV2akYDKzDW2gtws/efM8bEOkFERAqItfYU4Av7PHWjOl0WLpVSpEFQVvEY\n7tzDbiRuGe0DO3BtiC/QTHFhstaOB2bhzjiOZRbwDWPMlsxFlf+stZcAP8Utky4JOx4RCVfQ+vkl\n4KTgqYeNMZqcKGCaMU6Djh7xJYUn6II3FvhNnCFTcLPHp2Quqvxmrf0a7izpzygpFpHAZJqTYrV+\nFs0Yd4aOHPElhcda+2/AfUDvGF9uAn4C/MgY05jRwPKItfbbwHeAM4wx+kAqIntaPy+neeXuDmPM\n90IMSbKAEmORLGCtHYg71/jTcYa8AlyspC511tqbgCtwSfG6sOMRkexgrb0auDt4+DFwlDFmc4gh\nSRZQYiySJay1EeA63HJ/cYwh24FvAg9qY0jbgtpBC3wRlxS/H3JIIpIlgtbPa4CDg6duMMZMDzEk\nyRKqMRbJEsaYpuCN+STgjRhDugP3A49aa2OVXUggSIpvx+00n6CkWERauZ7mpHgdav0sAc0Yi2Qh\na2034A6auzC19i4wzRjzfMaCyhHBzPudwIlAhZZGRWRf1toBuNbPexp0XWKMmRFiSJJFNGMskoWM\nMTuMMVcB5wIfxhgyEPirtfZWa23XzEaXvay1RcCvcCd+TFRSLCIx/JDmpHgx8HB4oUi20YyxSJYL\nZjceACbFGbIQtzFvVcaCykLW2i7Ag0B/4BxjzPaQQxKRLGOtHYFr/bxnYrDCGKMud7KXZoxFslxQ\nH3sW8F3cOZutjQMWWWu/EtTWFpxg1vwxoA9QqaRYROK4lebcZ46SYmlNM8YiOcRaOwbXFW9EnCFP\nAl81xsQqv8hL1tpS4Pe4BjpfMsborHAR2Y+19jRgXvDQB443xiwKMSTJQpoxFskhxpjFuBniu+MM\nmQwssdaekbmowhNsUpyN6y55gZJiEYklWE3b9zi2mUqKJRYlxiI5xhhTZ4z5JnA2sCnGkAHAHGvt\n7dbaksxGlznW2p7AX3AndExVZ0ARSeB84ITg7w1AVYixSBZTYiySo4wxNcAoXHLYmoc7p/Nla+3w\njAaWAcE5znOAZcAVxphoyCGJSJYK9iD8ZJ+n7jLGvBNWPJLdlBiL5DBjzEagEvgWbhaktbHAq9ba\nq/JlY5619mDgr8B84GpjTFPIIYlIdvsqMCT4+0e0TJJFWtDmO5E8Ya0diduYNyrOkNm42dVY5Rc5\nwVrbH5gLPAVUqTW2iCQSlFytAQ4KnvqeMeaOEEOSLKcZY5E8YYxZhquh++84Qz6P25h3ZuaiSh9r\n7WG4HeWzjDE/UFIsIkm4geak+B3gFyHGIjlAM8YiechaexauKUi/OEP+C7jZGFOfsaA6wFp7JG6m\n+G5jzM/CjkdEsp+19lBc6+ey4KlpxpiZIYYkOUAzxiJ5yBjzNK6k4n/jDLkWeMVae2zmomofa+3R\nwPPAdCXFIpKCH9KcFL+GKzUTSUgzxiJ5LNhwdxXwM6A0xpB63OkVv8jG0oSgbroW+L4x5oGQwxGR\nHBF86F9C8wTgJGPM3BBDkhyhxFikAARHts0Cjosz5M/Al4NTLrKCtfYTuLiuNcY8GnY8IpI7rLWz\ncWe9A9QaY84KMx7JHSqlECkAxpgVwElAvN3Yn8NtzPtc5qKKz1p7Eu585q8rKRaRVFhrJ9CcFPvA\njSGGIzlGM8YiBcZaOxF4COgfZ8jdwA3GmLrMRdUs+KX2O+BSY0ys5iUiIjEF5WOvAOODpx4yxlwa\nYkiSY5QYixQga+2BwK+Bc+MMWQ5cZIxZkrmoIDhKbibwJWPMXzP5vUUkN1RU15TgNhcPx+2dqAdW\nAEtPblr4BeCxYGgDMMwYsy6UQCUnKTEWKVDBzMpXcEe3lccYsgu3BHlnJrrLWWs/D/wGOM8YM7+z\nv5+I5I6K6poIMBG3WXgCUAd4QBEQBXx8v6wH23cf5q8v68VWPLjdGKMyCkmJEmORAhcch/YwcHyc\nIc8Alxlj1ndiDF/ElXCcbYxZ0FnfR0RyT0V1zRDcLPAwoBsuIY7N94nQRCkN0a40jn/slimLMhSm\n5AklxiKCtbYrYHEzxLF+6XyAayf9p0TXSbTEWVtV2RDne08FpgNnGWMWt/smRCTvVFTXTAZmACW4\n2eHk+H4TnlcPTKutqnyyk8KTPKTEWET2staejvslNDDOkHuA64wxO/c8kdQSpztkfx4uAZ5bW1XZ\nFHy/KwEDnGmMWd4JtyQiOSpIimfS3KSjPeqAqUqOJVlKjEWkBWttH+Be4Pw4Q1YCU4wxi1Ja4nQJ\n8g5gFXDhyU0LPwt8DzjDGLM6XfGLSO4L3lsWE3v/Q6p2AqNrqyrXpOFakueUGIvIfoKNeZfi6n67\nxRjS+I43YNZ79P8inpfaEidEPb+p6Sj/7c192XySMebtNIQsInkiWIVaAIwhtfeWeKK4JHv8ntUq\nkXi6hB2AiGSfoD30A9baF3Eb807Y9+sfcEDxevpdipdogjiuIt+LFK1mcK/V3pGfAN7ucMAikk8m\n4lah4ibF/XqVcc1nRzJ8YG8ao1FeXLGBX9Yupyn2ZF9RcL0zgDmdErHkDXW+E5G4ghKHU4D/AJoA\n6ihhtTeYJq+DEzmeVwrMqKiuOaqjcYpIXrme2CtVe13z2ZFs2bmLi34+l2/86kVGDerD58cNSvSS\nbsAN6QxS8pMSYxFJyBjTaIypAk73Yd0q70iaEpYSp6QEeDxYOhWRAhecbDOBxPsVOKR3OfOWv09j\ntImPdjSwcPUmBh3cPdFLPGBCcH2RuPTLSESSYox5YZE38tqdlO3Ga37rOGfcIO664lPMvvksrjtn\ndIvXnDaiP/d9fQJP3VDBr646jU8e3a/1Zfdd4hQRGYU7SSKhp15Zy4QRAyjpEuHAHiWMH9KXhWs2\ntfWyOmBkOoKU/KXEWESSVu+VfsOnZQ3Fh9sbmPXiap557d0WYw/sUcIN5x7Hvc8s57zba/n13JXc\ndN5YepV3bX1ZLXGKyB7DaWO2GGDpus0c0bcHT91YwaxrJ7Jq/ce89MbGtl7mASPSEaTkLyXGIpKU\nvUucXssdd/NXbuDlNzaytW5Xi/EH9ShjR33j3lmcf6z+F/W7djOg936nL2mJU0T2KKWNkyg84McX\njWf+yg184ae1nP+fz9CjtJgrzjimrWsXBdcXiUuJsYgkK6klzj3eXP8x6z7YzolD+xLx4JNH96Mx\n2sRb/9oWa7iWOEUEXLfMaKIBPcqK6XdAOX9c8DaN0Sa21TVSu/hdThjSt61rR4Pri8Sl49pEJFlJ\nLXHu0eTD3CXvcfPksXTtEqEx6vPj3/+ThsaYv/P2LHG+mqZYRSQX+f4KoCjRUZBb6xpZ/9FOzj7+\ncH7/8lrKuhYxafRA1v5ra5tXB9RhUxJSYiwiyWpziXNfYwcfyFfOOIbrH/o7q9dvYWj/XvzwwnH8\n4JEFvLVxv19gWuIUKWBBU6HKE/F+8A9vbLnfxmfwH/3uVa46cwQXnDyEJt9n8dsfcM8zbea8ZcCy\nNIUseUqJsYgkq80lzn0d1a8XS9dt5s31WwBYtX4Lb7z/MZ8YfFCsxFhLnCIFyFpbhGs//+/A6CJ8\nerKNLX5PEs0av7VxKzfM+Hsq38oH5tVWVTZ0KGDJe6oxFpFkrcD9cmkh4nkUF0WIRLzmv3seb7z/\nMcce1psj+/UE4KhDejLysD68FWO5M+JHywY1/d9B1triTr8LEQmdtbartfbLuPeVR4G9Zz0e6m8k\nQto7N+8Abk/3RSX/eH7s9okiIi0Ep0ZsA1okr1NPG8q0CcNajJ0xbxUz//Ym54wbxHknDuaAbiVs\n2bmL2Qvf5om/r93v2p7fxIn+IiL4m4CZwAPGmCWddzciEgZrbTlwBa673WGxxvjAIm/klnpKeuB5\n6ZjAiwKLgfG1VZVpz7glvygxFpGkVVTXzME140hb6zt8n15s5Vj/zdZfWQQ8AMwyxnyQtu8nIhln\nre0FfB34LnBwnGE+8Dhw60uRcTtwyex+5zu2w05gdG1V5Zo0XEvynBJjEUlaRXXNmcATQMLeqynx\n/Z1H+uv+eAibTgMOjTGiEfhfXJL8F2NMY9q+t4h0KmvtQcC3gW8CveIM2w08BNxmjFm158mK6prJ\nuBWksg6EUAdMra2qfLID15ACosRYRJJWUV0TARYAY0jhhIoE9i5xnty00MPNRl8OnAfEavihUguR\nHGCtPRS4Dvga8Wd964FfA9ONMetiDQiS4xm494NU3nOiQAMwTUmxpEKJsYikpKK6ZgidvMRprT0A\nuBC4DDgpzmtVaiGSZay1R+FavF8G7Nf/PbAN+B/g58aYNvs4B+85jwHDcC3kE5Vy+biNdquAC1Q+\nIalSYiwiKcvkEqe19mjgUuASVGohkpWstccCNwMXEf/Eq83AfwF3G2M+SuX6wWrVGbikewLu/cPD\nzSJHcQlxGTAPd/rEs9poJ+2hxFhE2qWiumYyvj8D/HJS2zjeriXO4LxTlVqIZBFr7XjcGcTnJhi2\nHvhP4FfGmO0d/Z7BCTkjcd0yS3ElGcuBZTqnWDpKibGItNs19q6vve/1u6eOUr+JCHgJTuRP4xKn\nSi1EwhN0qTsN+D4wKcHQtcBtuA+qSlglJygxFpF2s9bO9+Hk9+n3y3cihw0lhCVOa+0xNJdaDIgx\nZE+pxf3A0yq1EGmfICH+LC4hPjnB0OXArcCjxpjdmYhNJF2UGItIu1hrTwFeAD4CDjfGbA9ziTMo\ntZiIm0WOV2rxL1ypxYMqtRBJTvBvazKuZOK4BENfBX4M/NEYo/peyUlKjEWkXay1s4GzgWpjzC1h\nx7OvJEst/okrtXhEpRYi+wtatF8M3AQcnWDoPOAnwBxjjJIKyWlKjEUkZdbakcBSXNnEIGPMppBD\niivJUovZuCRZpRZS8Ky1ZcCXcSdAHJ5g6J+Bnxhj5mckMJEMUGIsIimz1j6ISzR/YYy5Jux4kpFi\nqcUDxpilmYtOJHzW2p7AVbi2zf3iDPNx3S9/YoxZlKnYRDJFibGIpMRaeziwBrfBbqgxZm3IIaVM\npRYizay1BwLfCv47IM6wKO5D40+NMSszFZtIpikxFpGUWGt/DlyLSxinhB1PR6nUQgqVtXYAbnb4\nKlxHuVgagN/g2ja/naHQREKjxFhEkhbMLK3DtYMea4x5LeSQ0kalFlIorLWDcfXDXyZ+2+btwC+B\nnxljNmQqNpGwKTEWkaRZa28BLFBrjDkr7Hg6i0otJB9Za0fgTpiYgjtnPJaPgP8G7jLGbM5UbCLZ\nQomxiCTFWlsOvAMcBHzGGPNcyCFlhEotJNdZa4/HnUE8OcGwDcAdwL3GmG0ZCUwkCykxFpGkWGuv\nAe4CFgAnFtp5pSq1kFxjrT0NlxBXJBj2Nq4j5f3GmPpMxCWSzZQYi0ibrLVdgDeBI4DzjTFPhBtR\nuFRqIdkqaNt8Fi4hPiXB0JW4ts2PaJVDpJkSYxFpk7V2CvAwLjkeboyJhhxS1lCphWSDYEXjPFxC\nPDbB0H/iutQ9pbbNIvtTYiwiCQUzUIuAMcCVxphfhxxSVlKphYQhaNs8Bbep7pgEQ1/AJcS1hVYG\nJZIKJcYikpC19izgL8B6YLAxpiHkkLKetbY3cAEqtZBOErRtvhx37NqgBEOfxnWpeyEjgYnkOCXG\nIpKQtfY54HTgRmPM7SGHk3NUalG4KqprSoBRwHCgFKgHVgBLa6sq2/UB01rbA9eQ4zoSt21+ErjV\nGPNqe76PSKFSYiwicVlrTwBeAbYChxtjtoQcUs5SqUVhqKiuieD+P18PTADqcO3Ti3BtlX2gDJgH\nTAfm1lZVtlnra63tQ3Pb5t5xhkVxewFuM8Ys79idiBQmJcYiEpe19gnc2ae3GWNuCjuefKFSi/xU\nUV0zBHgMGIZrsewlGO4DO4BVwIW1VZWrYw2y1vanuW1z9zjXagB+i2vbvLZ90YsIKDEWkTistUfj\nln0bgSOMMetDDikvhV1q0RnL/YWoorpmMjADtxIQr6tcLFFcYjuttqryyT1PWmuPoLltc6zVBXCJ\n9Z62zfr3KZIGSoxFJCZr7X3AV4D7jDFfDTuefJfJUovOWu4vVEFSPBP3M2uvOmDqyU0LlwM3AxeT\nuG3znbi2zR924HuKSCtKjEVkP8Hy7dtAMXCMMWZVuBEVlqDUYk8DkRPjDGtXqUVnLPcXsuDnuRgo\n7+i1PL8pOtZ/PVJKQ7z/JxtxbZvvUdtmkc6hxFhE9mOtvQ23jPuEMeb8sOMpZNba4bhSi2l0sNQi\n3cv9hS6YeV+AO+M7lZ9nbH4T3ahjtL+i9aeVdcBtuLbNdR3+PiISlxJjEWnBWtsL94u4J3CCMWZB\nyCEJe0stJuFmkc8lxVKLdC73Kzl2KqprzgSeIP6mOHqUFvOdz4/m+CMPYsvOXdz/3Bs8t+z9uNeM\n+FGO8ddwAFsB3sC1bZ6lY/xEMkOJsYi0YK29CffL+DljzGfCjkf2l2SpxasEpRYvRcb1Jk3L/cBO\nYHRtVeWaNFwrp1VU18wBziBBOcpN5x1HxPP42ewlHHVIT6q/NJ7vPPAS72zaHvsFvk93tm8b7b9x\nBfCk2q+LZJYSYxHZy1pbiqst7gecZYypDTciaUtbpRY+NC7yRu6op6QnnhdJw7eM4pLs8bm0IS9o\nbV6CO3mjpNXfW//Z5nNRImWveGO/muhnWlJcxBPXn8nX7vkb723eAcD1XxjDh9vq+e1f34gfrO83\n4nk9dCqISOZ1CTsAEckql+CS4teAZ0KORZJgjFkB3GSt/T4xSi220LN4F8UH4DVPap4zbhCTxgzk\niL49eP7197njT0sAOObQA7j09GEM7d+LaJPPknc288va19m8vUV+VoTbuHcGMCdRbEEy2oUUk852\njm/rGl2T+4kmp45SiogSTfBrdOCB3Yg2+XuTYoC3Nm5l9KADE1/c8+qAkbhZfxHJICXGIgLsrWG9\nPnh4uzFGy0k5JFhyfxp4et9Si/e8fic20XJS88PtDcx6cTXjjjyYrsXNX+teWsyf/7mOV9d8QLSp\nias/O5LrPj+a7z/Sqszc97t3Z8ej1trXaTshTccsddbZSSl+wgM9oKy4iJ0NLUuDdzbspqxrm796\nPWAESoxFMk6JsYjscR4wBFgL/C7kWKQDjDEfAfdUVNfcj+9vx/NavNfPX7kBgGH9e3FQcene5xeu\n2dTiOn9a8DbTL/nk/t/A89jhl/dpwjs1QmF+fvKTyPfrGqOUlxS3eK5bSTF1u3a39dIi3IcLEcmw\nvPwkLyKpCZa8bwwe3mGMafM3t+SEUXjezna/+PA+vLMp9nG5EZrY2aEDLnKbR9vl1e9+uIOiiMeA\nPs17Hgf36xH3Z7qPKK4DoYhkmBJjEQH4NDAO2ATcH3Iskj7DSdzAI67BfXtw8WlD+fXcFTG/7uOx\ns4AnNcupx2tjtryhMcr8lRu4ZMIwSoqLOPaw3nxyWD+eXfpeW5f3geXpilVEkqdSChGB5tniO40x\n7Z5hlKxTSjsaTwzoXc5/XHQCv6xdzrL/+yjuuGTKCbLMLlyjkgbcjOy+fyb7XD3QUEpDNErRdNr4\n+d7952V895zRPP7diWyta+SuvyyLf1RbszJgWftuUUQ6QomxSIGz1o4FzsS1/v2fkMOR9KrHLcsn\nrW+vMm6deiKzXnizzZnNZMoJgCbiJJcZfm6XMSatx8tVVNd8jjbOMd5W34h9PKU9dD4wT0e1iYRD\nibGI3BD8+StjzOZQI5F0WwH7r/dHPI+iiEck4hHxPIqLIkSbfHp378ptU09k9oJ3qPnnuoQXbiKy\ns94rvRafpSRIUPO8Xn06cBIJOt+1ww7g9jReT0RSoMRYpIBZa48ELgB2Az8PORxJv6XEaAE95dQh\nTJswbO/jiaMHMmPeKnxgQJ9uTJ0wlKkThu79+rm3xejz4nnF7zLgod/ccmUhz2zOBVYBY2hHyUoM\n0eB6z6bhWiLSDup8J1LArLW/AL4BPGiMuSzkcKQTJNO2uB184NnaqspJabxmTqqorhmC2m2L5I2c\n2zkhIulhre0LfDl4qKXb/DUdtzyfTlruD9RWVa7GteOu6+Cl6oBpSopFwqXEWKRwfRN3asFsY4yO\nhspfe5b7U9qEl4CW+1uprap8EpiKm/FN9eccDV43NbiOiIRIibFIAbLW9gCuDh7eFmYs0rlqqyqb\ncO2h01UL3ABcEFxXAkFSOwZXVrGdGJseW/GDcYtx5RNKikWygBJjkcJ0JdAbmG+MmR92MNK5tNyf\nGcHPeTwwGTej3ghsBbbhZoW3BY8bg69PBsbr5ymSPbT5TqTAWGu7Am8BhwLnGGNmhxySZEhFdc1k\nYAZQQmqnKERxM8XTNLOZvIrqmhJgJDACV7ZUj+tot0znFItkJx3XJlJ4puCS4uVATcixSAbVVlU+\nWVFdswR4DBgGdCPxaRU+bqPdKlz5hGY2UxAkv68G/4lIDlAphUgBsdZGaG7ocXu6O4FJ9tNyv4hI\nfJoxFiksZwPDgXeBR0KORUISbJybA8zRcr9I9gv+nY7CvX/v+Xe6Aliqf6fppRpjkQJirZ0PnAx8\n1xijTnciIlmqoromAkwErgcm4Da/erj9AVFcqVMZMA93XvlcnRbTcSqlECkQ1tpTcEnxR8B9IYcj\nIiJxBB0VFwBP4DpXFgM9gR64Los9gsfFwdefABYEr5MOUGIsUjhuDP682xizPdRIREQkpuD0mMW4\nc7G703Y7dy8YNwZYHLxe2kmJsUgBsNaOxNUX1wF3hRyOiIjEECS1M3GzwqkcqUgwvhyYqeS4/ZQY\nixSG64M/f2uM2RRqJCIisp+gDGIGrm64I8qAGRXVNUd1PKrCo8RYJM9Zaw/HnV0cBe4IORwREWkl\n2Gj3GK75TjqUAI8H15UU6Lg2kfz3Hdy/9UeMMWvDDkZERPYzEdd0Z2/5xDnjBjFpzECO6NuD519/\nnzv+tGTv4LOOO4wLP3UUvbuX8Pq6zdwxewmbt7c4ta0ouN4ZuKMZJUn6JCGSx6y1fYArg4e3hxmL\niIjEdT2uE+VeH25vYNaLq3nmtXdbDBw9qA+Xf+Zofvj4Qs6f/gwbPq7j5sljY12zG80NnSRJSoxF\n8tvVuDfHWmPMa2EHIyIiLQXNOybQ6vSJ+Ss38PIbG9lat6vF+BOH9uOFFRt4Z9N2djf5PPzCm4we\ndCD9e5e3vrQHTAiuL0lSYiySp6y15cC3goe3hRmLiIjENQp3YlC7eEE6fcTBPWJ9uQ7X2VKSpMRY\nJH9dDhyEOyT++XBDERGROIbT9lnFey1c8y9OHX4Ig/v2oGuXCBefOpQm36ekOObpbh6u3bskSZvv\nRPKQtbYL8L3g4W3GGPV+FxHJTqWkcGbxorUfMvNvb1J1/vGUl3ThqX+spa5hNx9sjTnpXBRcX5Kk\nxFgkP10AHAG8Cfwh3FBERCSBetxxmkmbvfAdZi98B4BD+3RjyilDeHvTtlhDo8H1JUkqpRDJM9Za\nj+adyNONMSm94YqISEatAPZb1Yt4HsVFESIRr/nvwZ+DDu4OwME9S/l25Sj+8I+32V6/O9a1fWB5\np0afZzRjLJJ/KoAxwAZcFyUREcleS4nR7W7KqUOYNmHY3scTRw9kxrxVPPXKWm46bywDepezc9du\nnln8Lg8+/0a8a5cByzol6jzl+b5KDyX3BMfPjMJtWijFLRWtAJbWVlU2JHptPkh0/yc3LXwaOB24\nyRij0yhERLJcRXXNHFwzjqQ34SXBB56traqclMZr5j3NGEvOCFpbTsQdhD4BdwyNh9tcEMW9CZRV\nVNfMA6YDc2urKptCCjftkrp/3y9/3RvaZYC/cWc59feGF62IiKRgOnAS0D2N19yBGjulTDXGl16D\n3wAABpVJREFUkhMqqmuG4I4dewL3qboY6An0AMqDP3sGz58RjFsQvC7nJX3/ntdlCz1Z6Q0pfjUy\n+tl8uX8RkTw3F1hFipvwEogG13s2TdcrGCqlkKxXUV0zGVcrW0IKR9rg3hgagGm1VZVPdkZsmVDo\n9y8iUgiCiYzFuMmOjtoJjK6tqlyThmsVFM0YS1YLksKZuDeKVJJCgvHlwMzgOjmn0O9fRKRQ1FZV\nrgam0YEueIE63ISIkuJ20IyxZK1C//Rc6PcvIlKItEoYLs0YS1YKNpo9hntjSIcS4PHgulmv0O9f\nRKRQBUntGNzEyHZinHHcih+MW4ybAFFS3AH6JSnZaiIwjNTLB+IpCq53Rpqu19kK/f5FRApWUFYx\nHpiM20DXCGwFtuFWALcFjxuDr08GxmtVsON0XJtkq+uBbvs+cc64QUwaM5Aj+vbg+dff544/LQHg\n0yMH8O3KUXvHeZ5HaXERV9/3Aqs3bN33Et1wHeHmdHr0HZf0/e/r4lOHcMnpR3PTzL+zaO2Hrb+c\nS/cvIlLQguNG5wBzgrPrRwIjaD67fjmwrBDO7s8k1RhL1gneALbhjiTb61PHHEKT7zPuyIPpWhyJ\nmRgCTBo9kCmnDuHyXzwf68uNQI9sfiNp7/33712OueB4epZ1ZfofX4uVGEMO3L+IiEhYVEoh2WgU\nMXblzl+5gZff2MjWul0JXzxpzEDmLn0v3pfrcJ+6s1m77v+as47lN8+upDGasKdJLty/iIhIKFRK\nIdloOO1si9m3VxkjD+/DHbMXxx7gN5UcwgfXWGv/0ep7eK3+jPVcquPb9dwAb+DY9fQt8b3kP7ee\nOvwQGqNNLFi9qa2hHm4p7tWkLy4iIlIglBhLNiqlnZvOJo4+lGXrNrPx49jHQEbwS7r5Oy8DLmt3\ndJ2szK/H8/w2tyHvHd+1iMs/fQw3P/xKMsOLcD9fERERaUWJsWSjetrZFnPiqIE8On913K83Ednx\nnnfITf38D34XPLVv/ukn8Vyq41N+bq132EVNRO4Euse7j31NO20Yzy59l41bkjoTPor7+YqIiEgr\nSowlG62g7XMb9zNiYG8O7FHCCyvWxx/kedF6Sl82t5iNHYivU1VU1ywFEhYK7+u4wQdyUM8yzh43\nCIBe5SV8/98+weMvreHxl95qPdzH7WQWERGRVpQYSzZaCpS1fjLieRRFPCIRj4jnUVwUIdrk0xSc\nrDJpzEBeXLmBul0JJ5vLgGWdEnX6pHT/N858hS6R5nrku674FPfOWR6v3jgX7l9ERCQUSowl69RW\nVTZUVNfMwzWj2LtBbcqpQ5g2YdjecRNHD2TGvFXM/NubFBdFOG1Ef6p/l3BPmQ/My/ajytpz//uK\n+j7b6xupb9zvA0JO3L+IiEhYdI6xZKWK6pozgSdIss42SduBybVVlVnf4KLQ719ERCQMOsdYstVc\nYBXt3IQXQzS43rNpul5nK/T7FxERyTjNGEvWqqiuGQIsBsrTcLmdwOhc6iNf6PcvIiKSaZoxlqxV\nW1W5GphGjC5wKaoDpuVaUljo9y8iIpJpmjGWrFdRXTMZmAGUkFrjjyjQgEsKn+yM2DKh0O9fREQk\nU5QYS04IygoeA4YB3UjcMtoHduBqai/Ih5nSQr9/ERGRTFBiLDmjoromgjvC7AZgAq5EwMPNokZx\nCWEZMA+4HXi2tqoy6UYZ2a7Q719ERKSzKTGWnFRRXVMCjARGAKW4NsfLgWWFcE5vod+/iIhIZ1Bi\nLCIiIiKCTqUQEREREQGUGIuIiIiIAEqMRUREREQAJcYiIiIiIoASYxERERERQImxiIiIiAigxFhE\nREREBFBiLCIiIiICKDEWEREREQGUGIuIiIiIAEqMRUREREQAJcYiIiIiIoASYxERERERQImxiIiI\niAigxFhEREREBFBiLCIiIiICKDEWEREREQGUGIuIiIiIAEqMRUREREQAJcYiIiIiIoASYxERERER\nQImxiIiIiAigxFhEREREBFBiLCIiIiICKDEWEREREQGUGIuIiIiIAEqMRUREREQAJcYiIiIiIoAS\nYxERERERQImxiIiIiAigxFhEREREBFBiLCIiIiICKDEWEREREQGUGIuIiIiIAEqMRUREREQAJcYi\nIiIiIoASYxERERERQImxiIiIiAigxFhEREREBFBiLCIiIiICKDEWEREREQGUGIuIiIiIAEqMRURE\nREQAJcYiIiIiIoASYxERERERQImxiIiIiAigxFhEREREBID/B8lrBrNTdUYqAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113de53c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "weights = [e['weight'] / n * 10  for (u, v, e) in graph.edges(data=True)]\n",
    "\n",
    "plt.figure(figsize=(12, 8))\n",
    "plt.axis('off')\n",
    "\n",
    "layout = nx.spring_layout(graph)\n",
    "nx.draw_networkx_nodes(graph, layout, node_color='steelblue', node_size=520)\n",
    "nx.draw_networkx_edges(graph, layout, edge_color='gray', width=weights)\n",
    "nx.draw_networkx_labels(graph, layout, font_color='white')\n",
    "\n",
    "None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## run"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0, ..., 0) = 0\n",
      "(0, ..., 8) = 8\n",
      "(0, ..., 12) = 12\n",
      "(0, ..., 2) = 14\n",
      "(0, ..., 6) = 18\n",
      "(0, ..., 18) = 18\n",
      "(0, ..., 7) = 19\n",
      "(0, ..., 16) = 20\n",
      "(0, ..., 5) = 21\n",
      "(0, ..., 14) = 22\n",
      "(0, ..., 13) = 23\n",
      "(0, ..., 11) = 25\n",
      "(0, ..., 17) = 25\n",
      "(0, ..., 10) = 26\n",
      "(0, ..., 9) = 27\n",
      "(0, ..., 4) = 32\n",
      "(0, ..., 3) = 33\n"
     ]
    }
   ],
   "source": [
    "distances = dijkstra(graph, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
